`
https://leetcode.cn/problems/next-greater-element-i/
`

/**
 * @param {number[]} nums1
 * @param {number[]} nums2
 * @return {number[]}
 */
var nextGreaterElement = function (nums1, nums2) {
  // 记录 nums2 中每个元素的下一个更大元素
  const greater = calculateGreaterElement(nums2)
  // 建立映射
  const greaterMap = new Map()
  for (let i = 0; i < nums2.length; i++) {
    greaterMap.set(nums2[i], greater[i])
  }

  const res = new Array(nums1.length).fill(0)
  // nums1 是 nums2 的子集，所以根据 greaterMap 可以得到结果
  for (let i = 0; i < nums1.length; i++) {
    res[i] = greaterMap.get(nums1[i])
  }

  return res
};

// 计算每个元素的下一个更大元素
function calculateGreaterElement(nums) {
  const n = nums.length
  const res = new Array(n).fill(0)
  const stack = []

  for (let i = n - 1; i >= 0; i--) {
    const num = nums[i]
    while (stack.length && num > stack[stack.length - 1]) {
      stack.pop()
    }
    res[i] = stack.length ? stack[stack.length - 1] : -1
    stack.push(num)
  }

  return res
}